> ## Documentation Index
> Fetch the complete documentation index at: https://sequence-0fb8d9e6-api_docs.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Authenticating Users

> Documentation for Unreal SDK API to manage sessions for the Sequence infrastructure stack for web3 gaming.

<Warning>
  The examples below apply to versions 2.x.x.
  If you’re using version 3, use the SequenceEmbeddedWalletBP (Blueprints) and SequenceEmbeddedWallet (C++) classes instead.
</Warning>

## Requirements

* Make sure you have enabled your required login methods on [Sequence Builder](https://sequence.build/)
* Visit our [Platform Requirements](/sdk/unreal/advanced/platforms) page for detailed information on setting up and ensuring
  that the authentication methods you choose are properly configured in your Unreal project.

## Start Email Login

Sign in users with any email, and they will receive a one-time password in their inbox.
Listen for the Email Requires Code event.

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-api_docs/uFPNPaUQoWqBdCiH/images/unreal/start_email_login.png?fit=max&auto=format&n=uFPNPaUQoWqBdCiH&q=85&s=01063f3cdfe08cbfef26132fb5ffafab" width="2242" height="1184" data-path="images/unreal/start_email_login.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const TFunction<void()> OnApiSuccess = [] { };
    const FFailureCallback OnApiFailure = [](const FSequenceError& Error) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->StartEmailLogin(Email, OnApiSuccess, OnApiFailure);
    ```
  </Tab>
</Tabs>

## Confirm Email Login with Code

Sign in users with any email, and they will receive a one-time password in their inbox.
Listen for the Email Requires Code event.

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-api_docs/CmKz04BVDGuy1x-Z/images/unreal/confirm_email_login.png?fit=max&auto=format&n=CmKz04BVDGuy1x-Z&q=85&s=098714bb658a23fec16796ef8540a72e" width="2242" height="1184" data-path="images/unreal/confirm_email_login.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const FString Code = "123456";

    const TFunction<void()> OnApiSuccess = [] { };
    const FFailureCallback OnApiFailure = [](const FSequenceError& Error) { };
    const TFunction<void(FFederationSupportData)> OnApiFederationRequired = [this](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->ConfirmEmailLoginWithCode(Code, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

## Sign In as a Guest

You can sign in users as guests. However, note that they will lose access to their wallet if they uninstall the app or sign out.
Leverage our [account federation feature](/sdk/unreal/wallets/embedded-wallet/onboarding/authentication#account-federation) to link the wallet to another email or social account to keep access.

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-api_docs/uFPNPaUQoWqBdCiH/images/unreal/start_guest_session.png?fit=max&auto=format&n=uFPNPaUQoWqBdCiH&q=85&s=05c95b13ea3a8998b9b1f38f8ed734ba" width="2242" height="1184" data-path="images/unreal/start_guest_session.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const TFunction<void()> OnApiSuccess = [] { };
    const FFailureCallback OnApiFailure = [](const FSequenceError& Error) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->StartGuestSession(OnApiSuccess, OnApiFailure);
    ```
  </Tab>
</Tabs>

## Social Sign In

To initiate SSO-based authentication on desktop, you need to navigate to a browser to obtain the necessary id\_token.
On mobile, our SDK handles this process for you using integrated plugins.

On desktop platforms, listen for the `Sign in Web View Required` event and open the returned `Sign In URL`.
On mobile platforms, listen for the `Id Token Received` event.

When you call the `Sign In` functions, listen for the `Session Established` event on the `SequenceSessionsBP` subsystem
to know when the sign in request was successful. Listen for `Session Creation Failure` when something went wrong.

### Get Google Id Token

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-api_docs/auazpVRK2iFuGS6h/images/unreal/get_google_token.png?fit=max&auto=format&n=auazpVRK2iFuGS6h&q=85&s=a3f5777d038b238c5e10dfb706ed8856" width="2242" height="1184" data-path="images/unreal/get_google_token.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    if (Sessions->IsBrowserRequired)
        const FString Url = this->Sessions->GetGoogleSignInUrl();
    else
        Sessions->GetGoogleTokenId(this);
    ```
  </Tab>
</Tabs>

### Get Apple Id Token

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-api_docs/auazpVRK2iFuGS6h/images/unreal/get_apple_token.png?fit=max&auto=format&n=auazpVRK2iFuGS6h&q=85&s=54c3275d4a774c9765242a0c0826c521" width="2242" height="1184" data-path="images/unreal/get_apple_token.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    if (Sessions->IsBrowserRequired)
        const FString Url = this->Sessions->GetAppleSignInUrl();
    else
        Sessions->GetAppleTokenId(this);
    ```
  </Tab>
</Tabs>

### Sign In with Google

Sign In with a valid Google Id Token. You get this from the [Get Google Id Token](/sdk/unreal/wallets/embedded-wallet/onboarding/authentication#get-google-id-token) node.

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-api_docs/uFPNPaUQoWqBdCiH/images/unreal/signin_google.png?fit=max&auto=format&n=uFPNPaUQoWqBdCiH&q=85&s=70b463d993ba4bda6361c6d1bee573c8" width="2242" height="1184" data-path="images/unreal/signin_google.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const FString IdToken = "ey1234";

    const TFunction<void()> OnApiSuccess = []() { };
    const FFailureCallback OnApiFailure = [](const FSequenceError& Error) { };
    const TFunction<void(FFederationSupportData)> OnApiFederationRequired = [](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->StartOidcSession(IdToken, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

### Sign In with Apple

Sign In with a valid Apple Id Token. You get this from the [Get Apple Id Token](/sdk/unreal/wallets/embedded-wallet/onboarding/authentication#get-apple-id-token) node.

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-api_docs/uFPNPaUQoWqBdCiH/images/unreal/signin_apple.png?fit=max&auto=format&n=uFPNPaUQoWqBdCiH&q=85&s=b393bb95e6554f06ff1cd52e236c9473" width="2242" height="1184" data-path="images/unreal/signin_apple.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const FString IdToken = "ey1234";

    const TFunction<void()> OnApiSuccess = []() { };
    const FFailureCallback OnApiFailure = [](const FSequenceError& Error) { };
    const TFunction<void(FFederationSupportData)> OnApiFederationRequired = [](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->StartOidcSession(IdToken, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

### Sign In with Epic

Sign In with a valid Epic Games Id Token. Checkout the [EOS Plugin for Unreal](https://dev.epicgames.com/documentation/en-us/unreal-engine/online-subsystem-eos-plugin-in-unreal-engine)

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-api_docs/uFPNPaUQoWqBdCiH/images/unreal/signin_epic.png?fit=max&auto=format&n=uFPNPaUQoWqBdCiH&q=85&s=c1a8d5bdeb59c7576cfd4c3eae07329c" width="2242" height="1184" data-path="images/unreal/signin_epic.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const FString IdToken = "ey1234";

    const TFunction<void()> OnApiSuccess = []() { };
    const FFailureCallback OnApiFailure = [](const FSequenceError& Error) { };
    const TFunction<void(FFederationSupportData)> OnApiFederationRequired = [](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->StartOidcSession(IdToken, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

### Start Session with OIDC Id Token

Use this method to start a session using a valid Id token from Google, Apple or Epic Games.

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-api_docs/uFPNPaUQoWqBdCiH/images/unreal/signin_oidc.png?fit=max&auto=format&n=uFPNPaUQoWqBdCiH&q=85&s=0c80619bf586f982f5c8d1d1020e818a" width="2242" height="1184" data-path="images/unreal/signin_oidc.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const FString IdToken = "ey1234";

    const TFunction<void()> OnApiSuccess = []() { };
    const FFailureCallback OnApiFailure = [](const FSequenceError& Error) { };
    const TFunction<void(FFederationSupportData)> OnApiFederationRequired = [](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->StartOidcSession(IdToken, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

## PlayFab

You will need to include your PlayFab Title ID in the `SequenceConfig.ini` file
during [Configuration](/sdk/unreal/wallets/embedded-wallet/setup) and [configure PlayFab in the Builder](/solutions/builder/embedded-wallet/playfab-configuration).

### PlayFab Registration

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-api_docs/auazpVRK2iFuGS6h/images/unreal/playfab_registration.png?fit=max&auto=format&n=auazpVRK2iFuGS6h&q=85&s=ca119e59cc05497ae47c44954e2c30c7" width="2242" height="1184" data-path="images/unreal/playfab_registration.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const TFunction<void()> OnApiSuccess = [this, OnSuccess]() { };
    const FFailureCallback OnApiFailure = [this, OnFailure](const FSequenceError& Error) { };
    const TFunction<void (FFederationSupportData)> OnApiFederationRequired = [this](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->PlayFabRegistration(UsernameIn, EmailIn, PasswordIn, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

### PlayFab Login

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-api_docs/auazpVRK2iFuGS6h/images/unreal/playfab_login.png?fit=max&auto=format&n=auazpVRK2iFuGS6h&q=85&s=9c7855c8a151813e670bc5562e733542" width="2242" height="1184" data-path="images/unreal/playfab_login.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const TFunction<void()> OnApiSuccess = [this, OnSuccess]() { };
    const FFailureCallback OnApiFailure = [this, OnFailure](const FSequenceError& Error) { };
    const TFunction<void (FFederationSupportData)> OnApiFederationRequired = [this](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->PlayFabLogin(UsernameIn, PasswordIn, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

### PlayFab Authenticate with Session Ticket

<Tabs>
  <Tab title="Blueprint">
    <Frame>
      <img src="https://mintcdn.com/sequence-0fb8d9e6-api_docs/uFPNPaUQoWqBdCiH/images/unreal/playfab_session_ticket.png?fit=max&auto=format&n=uFPNPaUQoWqBdCiH&q=85&s=e14e638845abc8c3ec8ced18cfa89b19" width="2242" height="1184" data-path="images/unreal/playfab_session_ticket.png" />
    </Frame>
  </Tab>

  <Tab title="C++">
    ```cpp theme={null}
    const TFunction<void()> OnApiSuccess = [this, OnSuccess]() { };
    const FFailureCallback OnApiFailure = [this, OnFailure](const FSequenceError& Error) { };
    const TFunction<void (FFederationSupportData)> OnApiFederationRequired = [this](const FFederationSupportData& FederationData) { };

    USequenceSessions* Sessions = NewObject<USequenceSessions>();
    Sessions->PlayFabAuthenticateWithSessionTicket(SessionTicket, OnApiSuccess, OnApiFailure, OnApiFederationRequired);
    ```
  </Tab>
</Tabs>

## Account Federation

To link another account to your wallet, simply re-use the same authentication methods.
The SDK will check if [there's an existing session stored](/sdk/unreal/wallets/embedded-wallet/onboarding/manage_sessions#check-existing-session) and will
automatically attempt to link that account.
